package com.lovecaa.transaction;

import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

/**
 * 创建时间： 2023年10月26日 21:20:00
 *
 * @author Mr.Tao
 * @since 1.0.0
 */
public class TransactionListenerImpl implements TransactionListener {

    /**
     * 执行本地事务的方法
     * <p>
     * LocalTransactionState是个枚举，包含了3种状态
     *
     * @param msg Half(prepare) message
     * @param arg Custom business parameter
     * @return 本地事务执行状态
     */
    @Override
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        System.out.println("arg:" + arg);
        if (msg.getTags().equals("tagA")) {
            // 提交事务
            return LocalTransactionState.COMMIT_MESSAGE;
        }

        if (msg.getTags().equals("tagB")) {
            // 回滚事务
            return LocalTransactionState.ROLLBACK_MESSAGE;
        }
        // 其他标签都是无状态
        return LocalTransactionState.UNKNOW;
    }

    /**
     * 无状态的消息，Broker会调用此方法进行回查
     *
     * @param msg Check message
     * @return 本地事务执行状态
     */
    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        if (msg.getTags().equals("tagC")) {
            // 提交事务
            return LocalTransactionState.COMMIT_MESSAGE;
        }

        if (msg.getTags().equals("tagD")) {
            // 提交事务
            return LocalTransactionState.ROLLBACK_MESSAGE;
        }
        // 只有tagE会一直回查
        return LocalTransactionState.UNKNOW;
    }
}
